const path = require('path')
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const webpack = require('webpack')

const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = {
  // 入口文件
  entry: './src/main.js',
  // 编写输出配置
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'main.[contenthash].bundle.js',
    publicPath: '/'
  },
  module: {
    rules: [
      // vue 单文件组件的解析通过 style-loader 完成
      {
        test: /\.vue$/,
        use: [
          {
            loader: 'vue-loader',
            options: {
              
              transformAssetUrls: {
                // 配置vue文件template内引用图片路径时，相对的目录地址
                img: 'src'
              }
            }
          }
        ]
      },
      {
        test: /\.(js|jsx)$/,
        include: [path.resolve(__dirname, 'src')],
        loader: 'babel-loader'
      },
      // 因为代码中涉及使用 less 作为 css pre-processor
      // 所以在进入css解析前，得先用 less-loader 将 less 样式解析为 css
      {
        test: /\.(less|css)$/,
        use: [
          // 用 MiniCssExtractPlugin.loader 代替 style-loader
          // 实现样式文件单独导出
          MiniCssExtractPlugin.loader,
          "css-loader",
          'less-loader'
        ]
      },
      {
        test: /\.(png|jpe?g|gif)(\?.*)?$/,
        // 限定一下资源的目录
        include: [path.resolve(__dirname, 'src/assets')],
        use: [
          {
            loader: 'url-loader',
            options: {
              // 8kb以内的文件不单独引入，而是解析为base64
              limit: 8192,
              // url-loader 默认采用ES模块语法，但 vue 生成的时commonJS模块
              // 因此此处要关闭 esModule，以便对齐输出
              esModule: false,
              // 定义输出文件的文件名和目录，此处统一将资源输出在 static 目录下
              name: path.posix.join('assets', '[name].[contenthash].[ext]')
            }
          }
        ]
      }
    ]
  },
  plugins: [
    // webpack 自带的进度日志插件
    // ProgressPlugin可以监控各个hook执行的进度percentage，输出各个hook的名称和描述
    new webpack.ProgressPlugin(),
    // 构建时清理旧文件
    new CleanWebpackPlugin(),
    // 模板中 BASE_URL 需在此处定义全局变量以供引用
    new webpack.DefinePlugin({
      'BASE_URL': '"./"'
    }),
    // vue-loader 所必须依赖的插件，作用是:
    // 克隆与单文件相关的定义的任何其他规则，并将它们应用到.vue文件中的相应语言块
    // 比如 template/style/script
    new VueLoaderPlugin(),
    // 将css文件单独导出为文件，并使用 contenthash 的 哈希模式
    // contenthash 一方面方便文件修改时及时更新，另一方面在未涉及修改时不更新
    new MiniCssExtractPlugin({
      filename: '[name].[contenthash].css',
    }),
    // html插件 引入模板文件
    // 在模块打包完成后，覆盖模板文件中的文件路径以及入口模块
    new HtmlWebpackPlugin({
      title: 'Everything is Nothing',
      template: 'public/index.html'
    }),
    new CopyWebpackPlugin({
      patterns: [
        {
          // 拷贝 ico 图标至打包目录
          from: path.resolve(__dirname, "public/favicon.ico"),
          // 重写路径，希望在根目录下访问，以免出现 public/favicon.icon 的情况
          to: 'favicon.ico'
        }
      ]
    })
  ]
}